package com.ldn.database.dao.entities;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.ldn.common.basic.utils.system.DataUtils;
import com.ldn.common.basic.utils.system.DateUtils;
import com.ldn.common.basic.utils.system.StrUtils;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import lombok.Data;

import java.util.ArrayList;
import java.util.List;

/**
 * 提供实体类的公共字段
 * @author 李大牛家的牛 (scafel@163.com)
 * @product serverless
 * @className BasicEntities
 * @createDate 2025/1/14 - 10:40
 * @description 提供实体类的公共字段
 **/
@Data
public class BasicEntities {

    /**
     * id 自增长主键
     */
    @Id(keyType = KeyType.Auto)
    @JsonIgnore
    private Integer id;
    /**
     * 唯一编码 唯一索引
     */
    @Column(value = "code")
    @JsonProperty(value = "code")
    private String code;
    /**
     * 排序字段
     */
    @Column(value = "sort")
    @JsonProperty(value = "sort")
    private int sort;
    /**
     * 状态字段 0-禁用 1-正常
     */
    @Column(value = "status")
    @JsonProperty(value = "status")
    private int status;
    /**
     * 保护字段 0-未受到保护 1- 保护中
     */
    @Column(value = "protect")
    @JsonProperty(value = "protect")
    private int protect;
    /**
     * 热门字段 0-非热门 1-热门
     */
    @Column(value = "hot")
    @JsonProperty(value = "hot")
    private int hot;
    /**
     * 逻辑删除字段 0-未删除 1-已删除
     */
    @Column(value = "deleted")
    @JsonProperty(value = "deleted")
    @JsonIgnore
    private int deleted;
    /**
     * 乐观锁字段 默认为0 记录更新次数
     */
    @Column(value = "version", version = true)
    @JsonProperty(value = "version")
    @JsonIgnore
    private long version;
    /**
     * 创建时间 时间戳
     */
    @Column(value = "c_time")
    @JsonProperty(value = "c_time")
    @JsonIgnore
    private long ctime;
    /**
     * 更新时间 时间戳
     */
    @Column(value = "u_time")
    @JsonProperty(value = "u_time")
    @JsonIgnore
    private long utime;
    /**
     * 删除时间 时间戳
     */
    @Column(value = "d_time")
    @JsonProperty(value = "d_time")
    @JsonIgnore
    private long dtime;
    /**
     * 创建时管理员id
     */
    @Column(value = "c_a_u_id")
    @JsonProperty(value = "c_a_u_id")
    private int cauId;
    /**
     * 更新时管理员id
     */
    @Column(value = "u_a_u_id")
    @JsonProperty(value = "u_a_u_id")
    private int uauId;
    /**
     * 更新时用户id
     */
    @Column(value = "u_m_u_id")
    @JsonProperty(value = "u_m_u_id")
    private int umuId;
    /**
     * 创建时用户id
     */
    @Column(value = "c_m_u_id")
    @JsonProperty(value = "c_m_u_id")
    private int cmuId;
    /**
     * 更新时os 不一定准确
     */
    @Column(value = "u_os")
    @JsonProperty(value = "u_os")
    private String uos;
    /**
     * 更新时ip 不一定准确
     */
    @Column(value = "u_ip")
    @JsonProperty(value = "u_ip")
    private String uip;
    /**
     * 加密后的id字符串 非数据库字段
     */
    @Column(ignore = true)
    protected String enId;
    /**
     * 创建时间格式化时间字符串 非数据库字段
     */
    @JsonProperty(value = "c_time_value")
    @Column(ignore = true)
    protected String ctimeValue;
    /**
     * 更新时间格式化时间字符串 非数据库字段
     */
    @JsonProperty(value = "u_time_value")
    @Column(ignore = true)
    protected String utimeValue;
    /**
     * 删除时间格式化时间字符串 非数据库字段
     */
    @JsonProperty(value = "d_time_value")
    @Column(ignore = true)
    protected String dtimeValue;


    /**
     * 设置加密后的id字符串
     */
    public void setEnId() {
        this.enId = DataUtils.en(String.valueOf(getId()));
    }

    /**
     * 获取加密后的id字符串
     * @return 获取加密后的id字符串
     */
    public String getEnId() {
        return DataUtils.en(String.valueOf(getId()));
    }


    /**
     * 获取加密后的id字符串数组
     * @param idStr id字符串，以逗号分隔
     * @return id字符串数组
     */
    public String[] getEnIds(String idStr) {
        if (idStr == null || StrUtils.isBlank(idStr)) {
            return new String[0];
        }
        String[] ids = idStr.split(",");
        List<String> res = new ArrayList<>();
        for (String id : ids) {
            if (StrUtils.isNotBlank(id.trim())){
                res.add(DataUtils.en(id));
            }
        }
        return res.toArray(new String[0]);
    }

    /**
     * 获取创建时间格式化时间字符串
     * @return 获取格式化的时间字符串，格式为 yyyy年MM月dd日 HH:mm:ss形式的时间字符串
     */
    public String getCtimeValue() {
        return DateUtils.formatDate(ctime);
    }
    /**
     * 获取更新时间格式化时间字符串
     * @return 获取格式化的时间字符串，格式为 yyyy年MM月dd日 HH:mm:ss形式的时间字符串
     */
    public String getUtimeValue() {
        return DateUtils.formatDate(utime);
    }

    /**
     * 获取删除时间格式化时间字符串
     * @return 获取格式化的时间字符串，格式为 yyyy年MM月dd日 HH:mm:ss形式的时间字符串
     */
    public String getDtimeValue() {
        return DateUtils.formatDate(dtime);
    }
}
